home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_06
/
9n06095a
< prev
next >
Wrap
Text File
|
1991-04-14
|
11KB
|
394 lines
/**************************************************
* file d:\cips\ht.c
*
* Purpose: This program displays an image using a
* half toning process. The algorithm was taken
* from "Personal computer based image processing
* with halftoning," John A Saghri, Hsieh S. Hou,
* Andrew Tescher, Optical Engineering, March 1986,
* Vol.25, No. 3, pp 499-503. The
* display_using_halftoning determines display
* size and reads the image. The half_tone function
* implements the algorithm.
*
* The function print_halftone_array prints a half
* toned image array to a regular line printer.
*
* External Calls:
* rtiff.c - read_tiff_image (March CUJ, Lising 3)
* rstring.c - read_string
* numcvrt.c - get_integer
*
* Modifications:
* 30 September 86 - created
* 18 August 1990 - modified for use in the
* C Image Processing System.
**************************************************/
#include "d:\cips\cips.h"
#define FORMFEED '\014'
float eg[ROWS][COLS], ep[ROWS][COLS];
display_using_halftoning(in_image, file_name,
il, ie, ll, le, threshold, invert,
image_colors, image_header, monitor_type,
print)
char file_name[], monitor_type[];
int image_colors, invert,
il, ie, ll, le, threshold,
print;
short in_image[ROWS][COLS];
struct tiff_header_struct *image_header;
{
char response[80];
int channel,
color,
display_mode,
horizontal,
i,
j,
k,
l,
max_horizontal,
max_vertical,
not_finished,
one,
vertical,
x,
y,
zero;
/*******************************************
* Use the monitor type to set the vertical
* horizontal and display_mode parameters.
* Also set the values for one and zero.
* one and zero will vary depending on the
* monitor type.
********************************************/
if( (monitor_type[0] == 'M') ||
(monitor_type[0] == 'm')){
vertical = 3;
horizontal = 2;
display_mode = _HRESBW;
one = 1;
zero = 0;
}
if( (monitor_type[0] == 'C') ||
(monitor_type[0] == 'c')){
vertical = 3;
horizontal = 2;
display_mode = _MRES4COLOR;
one = 3;
zero = 1;
}
if( (monitor_type[0] == 'V') ||
(monitor_type[0] == 'v')){
vertical = 6;
horizontal = 4;
display_mode = _VRES16COLOR;
one = 15;
zero = 1;
}
if( (monitor_type[0] == 'E') ||
(monitor_type[0] == 'e')){
vertical = 6;
horizontal = 3;
display_mode = _ERESCOLOR;
one = 15;
zero = 1;
}
max_horizontal = (image_header->image_length+
50)/100;
max_vertical = (image_header->image_width+
50)/100;
if(horizontal > max_horizontal) horizontal =
max_horizontal;
if(vertical > max_vertical) vertical =
max_vertical;
if(print == 1){
vertical = 1;
horizontal = 1;
}
/* set graphics mode */
if(print == 0)
_setvideomode(display_mode); /* MSC 6.0 */
else{
printf("\n\nHT> Calculating for printing ");
printf("\nHT> Counting from 0 to 99\n");
}
/*********************************************
* Loop over horizontal and vertical. Read
* the image array and display it after
* calculating the half tone values.
*********************************************/
for(i=0; i<horizontal; i++){
for(j=0; j<vertical; j++){
read_tiff_image(file_name, in_image,
il+i*100, ie+j*100,
ll+i*100, le+j*100);
half_tone(in_image, threshold, eg, ep,
i, j, one, zero, invert,
print);
}
}
if(print == 1) printf("\n\nHT> Hit ENTER \
to continue");
read_string(response);
clear_text_screen();
}
/*******************************************
* half_tone(...
*
* ep[m][n] = sum of erros propogated
* to position (m,n).
* eg[m][n] = total error generated at
* location (m,n).
********************************************/
half_tone(in_image, threshold, eg, ep, yoff,
xoff, one, zero, invert, print)
int invert, threshold, xoff, yoff,
one, print, zero;
float eg[ROWS][COLS], ep[ROWS][COLS];
short in_image[ROWS][COLS];
{
float c[2][3],
sum_p,
t,
tt;
int color, count, i, j, m, n;
short srow, scol;
c[0][0] = 0.0;
c[0][1] = 0.2;
c[0][2] = 0.0;
c[1][0] = 0.6;
c[1][1] = 0.1;
c[1][2] = 0.1;
count = 0;
/***********************************************
* Calculate the total propogated error
* at location(m,n) due to prior
* assignment.
*
* Go through the input image. If the output
* should be one then display that pixel as such.
* If the output should be zero then display it
* that way.
*
* Also set the pixels in the input image array
* to 1's and 0's in case the print option
* was chosen.
************************************************/
for(i=0; i<ROWS; i++){
for(j=0; j<COLS; j++){
eg[i][j] = 0.0;
ep[i][j] = 0.0;
}
}
/**********************************************
* 29 February 1988 - Fix to remove a solid
* line at the bottom of each region. Loop over
* ROWS-1 and then draw an extra line.
***********************************************/
for(m=0; m<ROWS-1; m++){
for(n=0; n<COLS; n++){
sum_p = 0.0;
for(i=0; i<2; i++){
for(j=0; j<3; j++){
sum_p = sum_p + c[i][j] *
eg[m-i+1][n-j+1];
} /* ends loop over j */
} /* ends loop over i */
ep[m][n] = sum_p;
t = in_image[m][n] + ep[m][n];
tt = t;
/**********************************
* Here set the point [m][n]=one
***********************************/
if(t > threshold){
eg[m][n] = t - threshold*2;
++count;
color = one;
if(invert == 1) color = zero;
scol = (short)(n + xoff*COLS);
srow = (short)(m + yoff*ROWS);
if(invert == 1)
in_image[m][n] = 1;
else
in_image[m][n] = 0;
if(print == 0){
_setcolor(color); /* MSC 6.0 */
_setpixel(scol, srow); /* MSC 6.0 */
} /* ends if print == 0 */
} /* ends if t > threshold */
/**********************************
* Here set the point [m][n]=zero
***********************************/
else{
eg[m][n] = t;
color = zero;
if(invert == 1) color = one;
scol = (short)(n + xoff*COLS);
srow = (short)(m + yoff*ROWS);
if(invert == 1)
in_image[m][n] = 0;
else
in_image[m][n] = 1;
if(print == 0){
_setcolor(color); /* MSC 6.0 */
_setpixel(scol, srow); /* MSC 6.0 */
} /* ends if print == 0 */
} /* ends else t <= threshold */
} /* ends loop over n columns */
if(print == 1) printf("%3d", m);
} /* ends loop over m rows */
/* Now display an extra line if print is 0 */
if(print == 0){
for(j=0; j<COLS; j++){
if(in_image[ROWS-2][j] == 1)
color = zero;
else
color = one;
if(invert == 1){
if(in_image[ROWS-2][j] == 1)
color = zero;
else
color = one;
} /* ends if invert == 1 */